package com.example.aopdemo.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Aspect
@Component
public class DemoAop {

    /*
    *  第一个* -> 任意的返回值类型
    *  第二个* -> controller包下面的任意的类
    *  第三个* -> 类里面的所有的方法
    *  .. ->任意的参数
    *
    * 实现方式：
    * 1. 先切到一个具体的类上面的具体的方法上面去 -> * com.example.aopdemo.controller.DemoController.index()
    * 2. 把DemoController -> *
    * 3. 把index -> *
    * 4. index的()加入 ..
     */
    @Pointcut("execution(* com.example.aopdemo.controller.*.*(..))")
    public void pt() {
    }

//    @Before("pt()")
//    public void before(){
//        System.out.println("我在aop的before中");
//    }

    @Around("pt()")
    public void around(ProceedingJoinPoint pjp) {

        try {

            //执行controller
            //拿返回值
            long start = System.currentTimeMillis();

            String proceed = (String) pjp.proceed();
            long end = System.currentTimeMillis();

            //返回值类型 + 全类名.方法名()
            Signature signature = pjp.getSignature();

//            System.out.println(proceed);
//            System.out.println(signature);
            System.out.println("=====================");
//            //所在类的字节码对象->字节码类型的数据
//            System.out.println(signature.getDeclaringType());
//            //所在类的全类名
//            System.out.println(signature.getDeclaringTypeName());
//            //方法名
//            System.out.println(signature.getName());

            Date date = new Date();
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
            StringBuilder sb = new StringBuilder();
            sb.append(format.format(date))
                    .append(":")
                    .append(signature.getDeclaringTypeName())
                    .append(" : ")
                    .append(signature.getName())
                    .append("()被请求，")
                    .append("返回值是：")
                    .append(proceed)
                    .append(" 耗时：")
                    .append(end - start)
                    .append("毫秒");
            System.out.println(sb);

        } catch (Throwable e) {
            throw new RuntimeException(e);
        }

    }

}
